package com.budingge.common.io;

import java.io.File;
import java.io.IOException;

import com.budingge.common.io.FileOPStatus.OPStatus;

/**
 * @ClassName: FileUtils
 * @Description: 继承自org.apache.commons.io.FileUtils，增强原始类功能
 * @author budingge.com
 * @date 2014年5月1日 下午11:30:17
 * 
 */
public class FileUtils extends org.apache.commons.io.FileUtils {

	/**
	 * 移动文件
	 * 
	 * @param src_file_path
	 *            原始文件路径
	 * @param dest_file_path
	 *            目标文件路径
	 * @return
	 * @throws IOException
	 */
	public static OPStatus move(String src_file_path, String dest_file_path)
			throws IOException {
		return move(new File(src_file_path), new File(dest_file_path), false);
	}

	/**
	 * 移动文件
	 * 
	 * @param src_file_path
	 *            原始文件路径
	 * @param dest_file_path
	 *            目标文件路径
	 * @throws IOException
	 */
	public static OPStatus move(File src_file, File dest_file)
			throws IOException {
		return move(src_file, dest_file, false);
	}

	/**
	 * 复制文件
	 * 
	 * @param src
	 * @param dest
	 * @return
	 * @throws Exception
	 */
	public static OPStatus copy(File src, File dest, boolean override)
			throws Exception {
		OPStatus opStatus = OPStatus.Copy_File_Failed;

		if (override && dest.exists()) {
			dest.delete();
		}

		if (!dest.exists()) {
			try {
				if (src.isFile()) {
					copyFile(src, dest);
				} else {
					copyDirectory(src, dest);
				}
				opStatus = OPStatus.Copy_File_Success;
			} catch (Exception e) {
				// e.printStackTrace();
				throw e;
			}
		} else {
			opStatus = OPStatus.Dest_File_Exist;
		}
		return opStatus;
	}

	/**
	 * 复制文件
	 * 
	 * @param src
	 * @param dest
	 * @return
	 * @throws Exception
	 */
	public static OPStatus copy(String src, String dest, boolean override)
			throws Exception {
		return copy(new File(src), new File(dest), override);
	}

	/**
	 * 重命名文件
	 * 
	 * @param src
	 * @param dest
	 * @throws IOException
	 */
	public static OPStatus rename(String src, String dest) throws IOException {
		return rename(new File(src), new File(dest));
	}

	/**
	 * 重命名文件
	 * 
	 * @param src
	 * @param dest
	 * @throws IOException
	 */
	public static OPStatus rename(File src, File dest) throws IOException {
		return move(src, dest);
	}

	/**
	 * 删除文件
	 * 
	 * @param path
	 */
	public static OPStatus delete(String path) {
		return delete(new File(path));
	}

	/**
	 * 删除文件
	 * 
	 * @param path
	 */
	public static OPStatus delete(File file) {
		if (file.exists()) {
			if(file.delete()){
				return OPStatus.Delete_File_Success;
			}else{
				return OPStatus.Delete_File_Failed;
			}
		}else{
			return OPStatus.Src_File_No_Exist;
		}
	}

	/**
	 * 获取文件长度
	 * 
	 * @param path
	 * @return
	 */
	public static long length(String path) {
		return length(new File(path));
	}

	/**
	 * 获取文件长度
	 * 
	 * @param path
	 * @return
	 */
	public static long length(File file) {
		long length = -1;
		if (file.exists()) {
			length = file.length();
		}
		return length;
	}

	/**
	 * 移动文件
	 * 
	 * @param taskitem
	 * @throws IOException
	 */
	public static OPStatus move(String srcfile, String destfile,
			boolean override) throws IOException {
		return move(new File(srcfile), new File(destfile), override);
	}

	/**
	 * 移动文件
	 * 
	 * @param srcfile
	 *            原文件
	 * @param destfile
	 *            目标文件
	 * @param override
	 *            是否覆盖
	 * @throws IOException
	 */
	public static OPStatus move(File srcfile, File destfile, boolean override)
			throws IOException {
		OPStatus opStatus = OPStatus.Move_File_Failed;

		if (override && destfile.exists()) {
			destfile.delete();
		}
		if (!destfile.exists()) {
			try {
				if (srcfile.isFile()) {
					moveFile(srcfile, destfile);
				} else {
					moveDirectory(srcfile, destfile);
				}
				opStatus = OPStatus.Move_File_Success;
			} catch (IOException e) {
				// e.printStackTrace();
				throw e;
			}

		} else {
			opStatus = OPStatus.Dest_File_Exist;
		}
		return opStatus;
	}

}
